package meiyunting.shiwuzhaoling.controller;

import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
import org.springframework.web.client.RestTemplate;

import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

/**
 * 负载均衡演示控制器
 * 使用RestTemplate调用服务，展示负载均衡效果
 */
@Slf4j
@RestController
@RequestMapping("/api/demo")
public class LoadBalancerDemoController {

    @Autowired
    private RestTemplate restTemplate;
    
    @Value("${server.port}")
    private String serverPort;
    
    /**
     * 调用实例信息接口，测试负载均衡
     * @return 实例信息
     */
    @GetMapping("/call-instance")
    public Map<String, Object> callInstanceInfo() {
        log.info("【负载均衡测试】从端口 {} 发起调用实例信息请求", serverPort);
        System.out.println("\n\n====================================================");
        System.out.println("【控制台输出-重要信息】从端口 " + serverPort + " 发起调用实例信息请求");
        
        // 使用服务名称而不是具体URL，这会触发负载均衡
        Map<String, Object> result = restTemplate.getForObject("http://lost-found-service/api/simple-lb/port", Map.class);
        
        log.info("【负载均衡结果】请求被路由到端口: {}", result.get("port"));
        System.out.println("【控制台输出-重要信息】请求被路由到端口: " + result.get("port"));
        System.out.println("====================================================\n\n");
        
        return result;
    }
    
    /**
     * 多次调用实例信息接口，观察负载均衡效果
     * @param times 调用次数
     * @return 多次调用的结果
     */
    @GetMapping("/call-multiple/{times}")
    public Map<String, Object> callMultipleTimes(@PathVariable int times) {
        Map<String, Object> result = new HashMap<>();
        List<Map<String, Object>> calls = new ArrayList<>();
        Map<String, Integer> portCounts = new HashMap<>();
        
        log.info("【批量负载均衡测试】从端口 {} 发起 {} 次调用", serverPort, times);
        System.out.println("【控制台输出】从端口 " + serverPort + " 发起 " + times + " 次调用");
        
        for (int i = 0; i < times; i++) {
            Map<String, Object> response = restTemplate.getForObject(
                    "http://lost-found-service/api/simple-lb/port", Map.class);
            
            calls.add(response);
            
            // 统计每个端口被调用的次数
            String port = response.get("port").toString();
            portCounts.put(port, portCounts.getOrDefault(port, 0) + 1);
            
            log.info("【请求 #{} 结果】请求被路由到端口: {}", i+1, port);
            System.out.println("【控制台输出】请求 #" + (i+1) + " 被路由到端口: " + port);
        }
        
        result.put("calls", calls);
        result.put("statistics", portCounts);
        result.put("totalCalls", times);
        
        // 打印统计结果
        portCounts.forEach((port, count) -> {
            double percentage = (double) count / times * 100;
            log.info("【负载均衡统计】端口 {} 收到 {} 个请求 ({}%)", port, count, String.format("%.2f", percentage));
            System.out.println(String.format("【控制台输出】端口 %s 收到 %d 个请求 (%.2f%%)", port, count, percentage));
        });
        
        return result;
    }
} 